home *** CD-ROM | disk | FTP | other *** search
/ Freelog 100 / FreelogNo100-NovembreDecembre2010.iso / Musique / solfege / solfege-win32-3.17.0.exe / {app} / bin / Lib / UserDict.py < prev    next >
Text File  |  2006-03-06  |  6KB  |  176 lines

  1. """A more or less complete user-defined wrapper around dictionary objects."""
  2.  
  3. class UserDict:
  4.     def __init__(self, dict=None, **kwargs):
  5.         self.data = {}
  6.         if dict is not None:
  7.             self.update(dict)
  8.         if len(kwargs):
  9.             self.update(kwargs)
  10.     def __repr__(self): return repr(self.data)
  11.     def __cmp__(self, dict):
  12.         if isinstance(dict, UserDict):
  13.             return cmp(self.data, dict.data)
  14.         else:
  15.             return cmp(self.data, dict)
  16.     def __len__(self): return len(self.data)
  17.     def __getitem__(self, key):
  18.         if key in self.data:
  19.             return self.data[key]
  20.         if hasattr(self.__class__, "__missing__"):
  21.             return self.__class__.__missing__(self, key)
  22.         raise KeyError(key)
  23.     def __setitem__(self, key, item): self.data[key] = item
  24.     def __delitem__(self, key): del self.data[key]
  25.     def clear(self): self.data.clear()
  26.     def copy(self):
  27.         if self.__class__ is UserDict:
  28.             return UserDict(self.data.copy())
  29.         import copy
  30.         data = self.data
  31.         try:
  32.             self.data = {}
  33.             c = copy.copy(self)
  34.         finally:
  35.             self.data = data
  36.         c.update(self)
  37.         return c
  38.     def keys(self): return self.data.keys()
  39.     def items(self): return self.data.items()
  40.     def iteritems(self): return self.data.iteritems()
  41.     def iterkeys(self): return self.data.iterkeys()
  42.     def itervalues(self): return self.data.itervalues()
  43.     def values(self): return self.data.values()
  44.     def has_key(self, key): return self.data.has_key(key)
  45.     def update(self, dict=None, **kwargs):
  46.         if dict is None:
  47.             pass
  48.         elif isinstance(dict, UserDict):
  49.             self.data.update(dict.data)
  50.         elif isinstance(dict, type({})) or not hasattr(dict, 'items'):
  51.             self.data.update(dict)
  52.         else:
  53.             for k, v in dict.items():
  54.                 self[k] = v
  55.         if len(kwargs):
  56.             self.data.update(kwargs)
  57.     def get(self, key, failobj=None):
  58.         if not self.has_key(key):
  59.             return failobj
  60.         return self[key]
  61.     def setdefault(self, key, failobj=None):
  62.         if not self.has_key(key):
  63.             self[key] = failobj
  64.         return self[key]
  65.     def pop(self, key, *args):
  66.         return self.data.pop(key, *args)
  67.     def popitem(self):
  68.         return self.data.popitem()
  69.     def __contains__(self, key):
  70.         return key in self.data
  71.     @classmethod
  72.     def fromkeys(cls, iterable, value=None):
  73.         d = cls()
  74.         for key in iterable:
  75.             d[key] = value
  76.         return d
  77.  
  78. class IterableUserDict(UserDict):
  79.     def __iter__(self):
  80.         return iter(self.data)
  81.  
  82. class DictMixin:
  83.     # Mixin defining all dictionary methods for classes that already have
  84.     # a minimum dictionary interface including getitem, setitem, delitem,
  85.     # and keys. Without knowledge of the subclass constructor, the mixin
  86.     # does not define __init__() or copy().  In addition to the four base
  87.     # methods, progressively more efficiency comes with defining
  88.     # __contains__(), __iter__(), and iteritems().
  89.  
  90.     # second level definitions support higher levels
  91.     def __iter__(self):
  92.         for k in self.keys():
  93.             yield k
  94.     def has_key(self, key):
  95.         try:
  96.             value = self[key]
  97.         except KeyError:
  98.             return False
  99.         return True
  100.     def __contains__(self, key):
  101.         return self.has_key(key)
  102.  
  103.     # third level takes advantage of second level definitions
  104.     def iteritems(self):
  105.         for k in self:
  106.             yield (k, self[k])
  107.     def iterkeys(self):
  108.         return self.__iter__()
  109.  
  110.     # fourth level uses definitions from lower levels
  111.     def itervalues(self):
  112.         for _, v in self.iteritems():
  113.             yield v
  114.     def values(self):
  115.         return [v for _, v in self.iteritems()]
  116.     def items(self):
  117.         return list(self.iteritems())
  118.     def clear(self):
  119.         for key in self.keys():
  120.             del self[key]
  121.     def setdefault(self, key, default=None):
  122.         try:
  123.             return self[key]
  124.         except KeyError:
  125.             self[key] = default
  126.         return default
  127.     def pop(self, key, *args):
  128.         if len(args) > 1:
  129.             raise TypeError, "pop expected at most 2 arguments, got "\
  130.                               + repr(1 + len(args))
  131.         try:
  132.             value = self[key]
  133.         except KeyError:
  134.             if args:
  135.                 return args[0]
  136.             raise
  137.         del self[key]
  138.         return value
  139.     def popitem(self):
  140.         try:
  141.             k, v = self.iteritems().next()
  142.         except StopIteration:
  143.             raise KeyError, 'container is empty'
  144.         del self[k]
  145.         return (k, v)
  146.     def update(self, other=None, **kwargs):
  147.         # Make progressively weaker assumptions about "other"
  148.         if other is None:
  149.             pass
  150.         elif hasattr(other, 'iteritems'):  # iteritems saves memory and lookups
  151.             for k, v in other.iteritems():
  152.                 self[k] = v
  153.         elif hasattr(other, 'keys'):
  154.             for k in other.keys():
  155.                 self[k] = other[k]
  156.         else:
  157.             for k, v in other:
  158.                 self[k] = v
  159.         if kwargs:
  160.             self.update(kwargs)
  161.     def get(self, key, default=None):
  162.         try:
  163.             return self[key]
  164.         except KeyError:
  165.             return default
  166.     def __repr__(self):
  167.         return repr(dict(self.iteritems()))
  168.     def __cmp__(self, other):
  169.         if other is None:
  170.             return 1
  171.         if isinstance(other, DictMixin):
  172.             other = dict(other.iteritems())
  173.         return cmp(dict(self.iteritems()), other)
  174.     def __len__(self):
  175.         return len(self.keys())
  176.